package pe.com.rimac.portal.facturacion.handler.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.com.rimac.portal.facturacion.modelo.Factura;
import pe.com.rimac.portal.service.facturacion.criterio.CriterioBusqueda;

/**
 * Implementaci&oacute;n con funcionalidad espec&iacute;fica para el manejo de facturas electr&oacute;nicas.
 * 
 * @author Andres Deza Villacorta - Synopsis S.A
 * 
 */
public class FacturasListHandler extends BaseListHandler
{
	/**
	 * @see pe.com.rimac.portal.facturacion.handler.impl.BaseListHandler#executeSearch()
	 */
	@Override
	public void executeSearch()
	{
		validateSearchCriteria();
		results = aseguradoService.obtenerFacturas(searchCriteria);
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.handler.impl.BaseListHandler#markAll()
	 */
	@Override
	public void markAll()
	{
		for (Factura factura : results)
		{
			factura.setSeleccionado(true);
		}
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.handler.impl.BaseListHandler#unmarkAll()
	 */
	@Override
	public void unmarkAll()
	{
		for (Factura factura : results)
		{
			factura.setSeleccionado(false);
		}
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.handler.impl.BaseListHandler#mark(java.lang.String)
	 */
	@Override
	public void mark(String numeroFactura)
	{
		for (Factura factura : results)
		{
			if (factura.getNumero().equals(numeroFactura))
			{
				if (factura.isSeleccionado())
				{
					factura.setSeleccionado(false);
				}
				else
				{
					factura.setSeleccionado(true);
				}
			}
		}
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.handler.impl.BaseListHandler#getSelected(java.lang.String)
	 */
	@Override
	public Factura getSelected(String numero)
	{
		for (Factura factura : results)
		{
			if (factura.getDocumento().equals(numero))
			{
				return factura;
			}
		}
		return null;
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.handler.impl.BaseListHandler#getMarked()
	 */
	@Override
	public List<Factura> getMarked()
	{
		List<Factura> marked = new ArrayList<Factura>();
		for (Factura factura : results)
		{
			if (factura.isSeleccionado())
			{
				marked.add(factura);
			}
		}
		return marked;
	}

	/**
	 * @see pe.com.rimac.portal.facturacion.handler.ListHandler#getMarkedForExport(boolean)
	 */
	@Override
	public List<Factura> getMarkedForExport(boolean isPDF)
	{
		List<Factura> marked = getMarked();
		if (isPDF)
		{
			List<Factura> pdfMarked = new ArrayList<Factura>();
			for (int i = 0; i < marked.size(); i++)
			{
				Factura factura = marked.get(i);
				pdfMarked.add(factura);
			}
			return pdfMarked;
		}
		return marked;
	}

	/**
	 * 
	 */
	private void validateSearchCriteria()
	{
		if (searchCriteria == null)
		{
			throw new IllegalArgumentException("Se debe establecer un criterio de busqueda.");
		}
		if (StringUtils.isBlank(searchCriteria.getTipoDocumentoCliente())
				|| StringUtils.isBlank(searchCriteria.getNumeroDocumentoCliente())
				|| StringUtils.isBlank(searchCriteria.getCodigoEmpresa())
				|| searchCriteria.getCriterioBusqueda() == null)
		{
			throw new IllegalArgumentException(
					"Debe establecer los parametros obligatorios: tipo de documento, numero de documento, codigo empresa y criterio de busqueda.");
		}
		if (CriterioBusqueda.POR_FECHAS.equals(searchCriteria.getCriterioBusqueda()))
		{
			if (StringUtils.isBlank(searchCriteria.getFechaInicio())
					|| StringUtils.isBlank(searchCriteria.getFechaFin()))
			{
				throw new IllegalArgumentException("Se debe establecer el rango de fechas.");
			}
		}
		else if (CriterioBusqueda.POR_NUMERO_DOCUMENTO_SUNAT.equals(searchCriteria.getCriterioBusqueda()))
		{
			if (StringUtils.isBlank(searchCriteria.getTipoDocumentoSUNAT())
					|| StringUtils.isBlank(searchCriteria.getSerieDocumentoSUNAT())
					|| StringUtils.isBlank(searchCriteria.getNumeroDocumentoSUNAT()))
			{
				throw new IllegalArgumentException("Se debe establecer los valores del documento SUNAT.");
			}
		}
		else if (CriterioBusqueda.POR_PRODUCTO_Y_POLIZA.equals(searchCriteria.getCriterioBusqueda()))
		{
			if (StringUtils.isBlank(searchCriteria.getProducto()) || StringUtils.isBlank(searchCriteria.getPoliza())
					|| StringUtils.isBlank(searchCriteria.getProductoFechaInicio())
					|| StringUtils.isBlank(searchCriteria.getProductoFechaFin()))
			{
				throw new IllegalArgumentException(
						"Se debe establecer la fecha de inicio, fecha fin, produco y poliza para la busqueda.");
			}
		}
		else if (CriterioBusqueda.POR_NUMERO_DOCUMENTO_COBRO.equals(searchCriteria.getCriterioBusqueda()))
		{
			if (StringUtils.isBlank(searchCriteria.getDocumentoCobro()))
			{
				throw new IllegalArgumentException("Se debe establecer el documento de cobro para la busqueda.");
			}
		}
	}
}